//
// Created on 2025-08-11.
//
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
// please include "napi/native_api.h".

#include "json_parser.h"
#include "yyjson.h"
#include "json_error.h"
#include "yyjson_util.h"

napi_value json_parser::ParseJson(napi_env env, const char *jsonStr, size_t len) {
    unique_yyjson_doc doc(yyjson_read(jsonStr, len, YYJSON_READ_INSITU));
    if (doc.get() == nullptr) {
        handleYYJSONError(env, YYJSON_CREATE_DOC_FAILED);
    }
    yyjson_val *root = yyjson_doc_get_root(doc.get());
    return yyjson_to_napi(env, root);
}

napi_value json_parser::ParseInc(napi_env env, char *data, size_t byteLength) {
    unique_yyjson_incr_state state(yyjson_incr_new(data, byteLength, YYJSON_READ_INSITU, NULL));
    if (state.get() == nullptr) {
        handleYYJSONError(env, YYJSON_CREATE_DOC_FAILED);
    }
    
    unique_yyjson_doc doc;
    yyjson_read_err err;
    size_t readSoFar = 0;
    size_t blockSize = 102400;
    do {
        readSoFar += blockSize;
        if (readSoFar > byteLength) {
            readSoFar = byteLength;
        }
        doc.reset(yyjson_incr_read(state.get(), readSoFar, &err));
        if (err.code != YYJSON_READ_SUCCESS) {
            handleYYJSONError(env, err.code);
        }
    } while (readSoFar < byteLength);
    
    if (doc.get() == nullptr) {
        handleYYJSONError(env, YYJSON_CREATE_DOC_FAILED);
    }
    
    yyjson_val *root = yyjson_doc_get_root(doc.get());
    return yyjson_to_napi(env, root);
}